home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / stdio / RCS / fseek.c,v < prev    next >
Text File  |  1991-12-02  |  6KB  |  239 lines

  1. head     1.5;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.5.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.5
  10. date     89.06.15.22.37.53;  author douglis;  state Exp;
  11. branches 1.5.1.1;
  12. next     1.4;
  13.  
  14. 1.4
  15. date     88.07.29.18.56.35;  author ouster;  state Exp;
  16. branches ;
  17. next     1.3;
  18.  
  19. 1.3
  20. date     88.07.25.13.12.53;  author ouster;  state Exp;
  21. branches ;
  22. next     1.2;
  23.  
  24. 1.2
  25. date     88.07.21.16.04.25;  author ouster;  state Exp;
  26. branches ;
  27. next     1.1;
  28.  
  29. 1.1
  30. date     88.06.10.16.23.51;  author ouster;  state Exp;
  31. branches ;
  32. next     ;
  33.  
  34. 1.5.1.1
  35. date     91.12.02.19.58.11;  author kupfer;  state Exp;
  36. branches ;
  37. next     ;
  38.  
  39.  
  40. desc
  41. @@
  42.  
  43.  
  44. 1.5
  45. log
  46. @Optimize for the case in which we are doing only reads and we
  47. can reset the pointers without doing a real lseek.  (Don't
  48. bother if relative to EOF, or if the buffer is invalid.)  This
  49. is useful when people want to peek forward more than one
  50. character at a time and use fseek to reset the buffer after
  51. peeking.
  52. @
  53. text
  54. @/* 
  55.  * fseek.c --
  56.  *
  57.  *    Source code for the "fseek" library procedure.
  58.  *
  59.  * Copyright 1988 Regents of the University of California
  60.  * Permission to use, copy, modify, and distribute this
  61.  * software and its documentation for any purpose and without
  62.  * fee is hereby granted, provided that the above copyright
  63.  * notice appear in all copies.  The University of California
  64.  * makes no representations about the suitability of this
  65.  * software for any purpose.  It is provided "as is" without
  66.  * express or implied warranty.
  67.  */
  68.  
  69. #ifndef lint
  70. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/fseek.c,v 1.4 88/07/29 18:56:35 ouster Exp Locker: douglis $ SPRITE (Berkeley)";
  71. #endif not lint
  72.  
  73. #include "stdio.h"
  74. #include "fileInt.h"
  75.  
  76. extern long lseek();
  77.  
  78. /*
  79.  *----------------------------------------------------------------------
  80.  *
  81.  * fseek --
  82.  *
  83.  *    Modify the access position of a stream.
  84.  *
  85.  * Results:
  86.  *    Returns 0 if the seek was completed successfully, -1 if any
  87.  *    sort of error occurred.
  88.  *
  89.  * Side effects:
  90.  *    The access position of stream (i.e. the place in the file where
  91.  *    the next character will be read or written) is set to the sum
  92.  *    of offset and a base value.  If base is 0, the base value is 0.
  93.  *    If base is 1, the base value is the current access position.
  94.  *    If base is 2, the base value is the length of the file.
  95.  *
  96.  *----------------------------------------------------------------------
  97.  */
  98.  
  99. long
  100. fseek(stream, offset, base)
  101.     register FILE *stream;        /* Stream whose position is to
  102.                      * be changed. */
  103.     int offset;                /* See above for explanation. */
  104.     int base;                /* See above for explanation. */
  105. {
  106.     int result;
  107.  
  108.     if ((stream->readProc != (void (*)()) StdioFileReadProc)
  109.         || ((stream->flags & (STDIO_READ|STDIO_WRITE)) == 0)) {
  110.     return -1;
  111.     }
  112.  
  113.     /*
  114.      * Optimize for the case in which we are doing only reads and we
  115.      * can reset the pointers without doing a real lseek.  (Don't
  116.      * bother if relative to EOF, or if the buffer is invalid.)  This
  117.      * is useful when people want to peek forward more than one
  118.      * character at a time and use fseek to reset the buffer after
  119.      * peeking.
  120.      */
  121.     if (((stream->flags & (STDIO_READ|STDIO_WRITE)) == STDIO_READ) &&
  122.     (base != 2) && stream->readCount > 0) {
  123.     int endAddr;        /* file pointer for end of read buffer  */
  124.     int curAddr;        /* file pointer for current ptr into read
  125.                    buffer  */
  126.     int startAddr;        /* file pointer for start of read buffer  */
  127.     int newAddr;        /* file pointer after seek */
  128.     
  129.     endAddr = lseek((int) stream->clientData, (long) 0, 1);
  130.     if (endAddr == -1) {
  131.         return -1;
  132.     }
  133.     curAddr = endAddr - stream->readCount;
  134.     startAddr = curAddr - (stream->lastAccess + 1 - stream->buffer);
  135.     newAddr = offset;
  136.     if (base == 1) {
  137.         newAddr += curAddr;
  138.     }
  139.     if (newAddr >= startAddr && newAddr <= endAddr) {
  140.         stream->readCount += curAddr - newAddr;
  141.         stream->lastAccess -= curAddr - newAddr;
  142.         stream->flags &= ~STDIO_EOF;
  143.         return 0;
  144.     }
  145.     }
  146.     
  147.     /*
  148.      * I'm going to reset all the buffer pointers, so flush any pending
  149.      * output.
  150.      */
  151.     
  152.     result = fflush(stream);
  153.  
  154.     /*
  155.      * Compute the offset and base to pass to the system to reposition.
  156.      * This is a tricky if the base value is the current access position:
  157.      * have to account for the characters that the system has passed to
  158.      * me but that I haven't passed to the user.
  159.      */
  160.     
  161.     if (base == 1) {
  162.     offset -= stream->readCount;
  163.     }
  164.  
  165.     stream->readCount = 0;
  166.     stream->writeCount = 0;
  167.     stream->lastAccess = stream->buffer - 1;
  168.     stream->flags &= ~STDIO_EOF;
  169.  
  170.     if (lseek((int) stream->clientData, (long) offset, base) == -1) {
  171.     return -1;
  172.     }
  173.     return result;
  174. }
  175. @
  176.  
  177.  
  178. 1.5.1.1
  179. log
  180. @Initial branch for Sprite server.
  181. @
  182. text
  183. @d17 1
  184. a17 1
  185. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/fseek.c,v 1.5 89/06/15 22:37:53 douglis Exp $ SPRITE (Berkeley)";
  186. @
  187.  
  188.  
  189. 1.4
  190. log
  191. @Lint.
  192. @
  193. text
  194. @d17 1
  195. a17 1
  196. static char rcsid[] = "$Header: fseek.c,v 1.3 88/07/25 13:12:53 ouster Exp $ SPRITE (Berkeley)";
  197. d60 34
  198. @
  199.  
  200.  
  201. 1.3
  202. log
  203. @Lint.
  204. @
  205. text
  206. @d17 1
  207. a17 1
  208. static char rcsid[] = "$Header: fseek.c,v 1.2 88/07/21 16:04:25 ouster Exp $ SPRITE (Berkeley)";
  209. d83 1
  210. a83 1
  211.     if (lseek((int) stream->clientData, offset, base) == -1) {
  212. @
  213.  
  214.  
  215. 1.2
  216. log
  217. @Fseek must return a "long".
  218. @
  219. text
  220. @d17 1
  221. a17 1
  222. static char rcsid[] = "$Header: fseek.c,v 1.1 88/06/10 16:23:51 ouster Exp $ SPRITE (Berkeley)";
  223. d22 2
  224. @
  225.  
  226.  
  227. 1.1
  228. log
  229. @Initial revision
  230. @
  231. text
  232. @d17 1
  233. a17 1
  234. static char rcsid[] = "$Header: atoi.c,v 1.1 88/04/28 17:20:23 ouster Exp $ SPRITE (Berkeley)";
  235. d44 1
  236. a44 1
  237. int
  238. @
  239.